// fork
#include<stdio.h>
#include<stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>

int main(int argc, char* argv[])
{
    char* msg;
    int n;
    // 进程编号
    // cat /proc/sys/kernel/pid_max
    pid_t pid;
    //创建一个新进程，克隆当前进程
    //返回值
    pid = fork();
    switch(pid)
    {
        case -1:
            perror("创建子进程失败！\n");
            return 1;
            break;
        case 0:
        // 在子进程中执行
            msg = "子进程";
            n = 7;
            printf("子进程：%d, %d\n", getpid(), getppid());
            pid_t pid1 = fork();
            switch(pid1)
            {
                case -1:
                    perror("子进程中创建进程失败！\n");
                    return 1;
                    break;
                case 0:
                    printf("子进程中的子进程%d, 其父进程%d\n", getpid(), getppid());
                    break;
                default:
                    printf("在%d号进程中\n", getpid());
            }
            exit(42);
            break;
        default:
        // 在父进程中执行
            msg = "----主进程";
            n = 3;
            printf("主进程：%d, %d\n", getpid(), getppid());
    }

    for(int i = 0; i < n; i++)
    {
        printf("%s\n", msg);
        sleep(1);
    }
    if(pid != 0)
    {
        printf("等待子进程结束\n");
        // 退出时的状态码
        int status;
        // 等待结束，会阻塞
        wait(&status);
        //判断子进程是否结束
        if(WIFEXITED(status))
        {
            printf("子进程结束，状态码：%d\n", WEXITSTATUS(status));
        }
        printf("子进程结束\n");
    }
    return 0;
}